package com.fjnu.fjnu_grade_demo.factory;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * LambdaQueryWrapper工厂类
 * 用于高效地生成和管理LambdaQueryWrapper实例，以避免反复创建相同类型的Wrapper对象
 */
public class LambdaQueryWrapperFactory {
    // 使用ThreadLocal存储每个线程独有的Wrapper实例，避免线程间干扰
    private static final ThreadLocal<Map<Class<?>, LambdaQueryWrapper<?>>> threadLocalWrapper =
            ThreadLocal.withInitial(ConcurrentHashMap::new);

    /**
     * 获取LambdaQueryWrapper实例
     * 该方法首先尝试从当前线程的ThreadLocal中获取已存在的Wrapper实例如果不存在，则创建新的实例并存储
     * 如果已存在，则清除其条件，以准备新的查询
     *
     * @param clazz 实体类类型，用于指定返回的LambdaQueryWrapper类型
     * @param <T> 泛型参数，表示实体类类型
     * @return LambdaQueryWrapper实例，用于执行查询操作
     */
    @SuppressWarnings("unchecked")
    public static <T> LambdaQueryWrapper<T> getLambdaQueryWrapper(Class<T> clazz) {
        // 获取当前线程的Wrapper映射
        Map<Class<?>, LambdaQueryWrapper<?>> wrapperMap = threadLocalWrapper.get();
        // 尝试从映射中获取指定类型的Wrapper实例
        LambdaQueryWrapper<T> lambdaQueryWrapper = (LambdaQueryWrapper<T>) wrapperMap.get(clazz);

        // 如果映射中不存在该类型的Wrapper实例，则创建并存储
        if (lambdaQueryWrapper == null) {
            lambdaQueryWrapper = new LambdaQueryWrapper<>();
            wrapperMap.put(clazz, lambdaQueryWrapper);
        } else {
            // 如果映射中已存在该类型的Wrapper实例，则清除其条件，以准备新的查询
            lambdaQueryWrapper.clear();
        }

        // 返回LambdaQueryWrapper实例
        return lambdaQueryWrapper;
    }
}
